這篇應該是topic
系列的最後一篇了,最近居然被催文章進度說太慢了,我只是想驗證node之間可以用不同語言也能溝通,才會寫了這麼多篇用不同語言寫的node嘛 QQ
好吧所以我們一樣先從官網範例中拿到listener.cpp
的資料:
$ roscd beginner_tutorials/src
$ wget https://raw.github.com/ros/ros_tutorials/kinetic-devel/roscpp_tutorials/listener/listener.cpp
接著就可以來解析程式碼啦:
1 #include "ros/ros.h"
2 #include "std_msgs/String.h"
3
4 void chatterCallback(const std_msgs::String::ConstPtr& msg)
5 {
6 ROS_INFO("I heard: [%s]", msg->data.c_str());
7 }
8
9 int main(int argc, char **argv)
10 {
11 ros::init(argc, argv, "listener");
12 ros::NodeHandle n;
13 ros::Subscriber sub = n.subscribe("chatter", 1000, chatterCallback);
14 ros::spin();
15 return 0;
16 }
其實好像就...跟之前差不多 XDsubscriber
一樣就是持續監聽某個topic
,並且在收到訊息的時候呼叫一個callback function
,對該訊息執行相對應的動作,方法subscribe
的定義如下:
template<class M>
ros::Subscriber subscribe(const std::string& topic, uint32_t queue_size, <callback>, const ros::TransportHints& transport_hints = ros::TransportHints());
這個函式底下有四個參數,第一個和第二個我們應該講到爛了就是topic
的名稱和訊息佇列的大小,第三個參數是callback function
,第四個則是關於傳輸的一些指令,關於三跟四的參數我會在底下一一介紹。
callback的參數在C++裡面可以吃不一樣的型別,但基本上都是用指標在存這個變數,大概有下面這六種變化:
1 void callback(boost::shared_ptr<std_msgs::String const>);
2 void callback(std_msgs::StringConstPtr);
3 void callback(std_msgs::String::ConstPtr);
4 void callback(const std_msgs::String&);
5 void callback(std_msgs::String);
6 void callback(const ros::MessageEvent<std_msgs::String const>&);
基本上都是std_msgs
底下的指標,應該內部有不同的方法可以呼叫,這個就用到的時候再去察看吧!
這個參數雖然在我們的主程式裡面沒有用到,但是因為API文件裡面有提到,我就還是一起拿出來講吧~
這個參數大概就是設定傳輸層在收到訊息的時候要怎麼過濾訊息的方法,大概有以下幾種,可以用.
串接:
ros::TransportHints()
.reliable()
.unreliable()
.maxDatagramSize(1000)
.tcpNoDelay();
reliable()
和unreliable()
是指定要接收的訊息是透過TCP還是UDP傳輸的;maxDatagramSize()
就是限制收到的訊息大小,tcpNoDelay()
就是可以提高傳輸速度啦,預設是true這樣。
終於解析完code啦,接著就是編譯跟執行囉!
編譯的話一樣要去package
底下的CMakelist.txt
新增執行檔跟設定相依的函式庫:
add_executable(listener src/listener.cpp)
target_link_libraries(listener ${catkin_LIBRARIES})
make
完以後就可以執行啦,既然現在我們有兩組publisher
和兩組subscriber
,就可以來玩看看node
跟node
之間的溝通囉!
可以看出右邊的兩個subscriber
都可以接收的到左邊publisher
發送出去的訊息囉!
ROS API - TransportHints Class Reference